#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
// int main()
// {
//     int i = 0;
//     while(1)
//     {
//         printf("exe进程第%d次Print\n",++i);
//         sleep(1);

//         if(i == 5)
//             break;
//     }
//     return 5;
// }

// int main()
// {
//     int ret = fork();
//     if(ret>0)
//     {
//         //父进程
//         int i = 0;
//         while(1)
//         {
//             printf("父进程运行中！ pid:%d  ppid:%d\n",getpid(),getppid());
//             sleep(1);
//             if(i++ == 5)
//             {
//                 break;
//             }
//         }
//     }
//     else if(ret == 0)
//     {
//         //子进程
//         while(1)
//         {

//             printf("子进程运行中！ pid:%d  ppid:%d\n",getpid(),getppid());
//             sleep(1);
//         }
//     }
//     return 0;
// }

// int main()
// {
//     printf("Hello PATH！\n");
//     return 0;
// }


//给函数传参式打印环境变量表
// int main(int argc,char *argv[],char *envp[])
// {
//     for(int i = 0;envp[i];++i)
//     {
//         printf("%s\n",envp[i]);
//     }
//     return 0;
// }

//全局变量方式打印环境变量表
// int main()
// {
//     //需要声明指针和stdlib库
//     extern char** environ;
//     for(int i = 0;environ[i];++i)
//     {
//         printf("%s\n",environ[i]);
//     }
//     return 0;
// }

//通过getenv查找环境变量表模拟实现pwd
// int main()
// {
//     printf("%s\n",getenv("USER"));
//     return 0;
// }

//添加本地变量到环境变量中搜索环境变量
// int main()
// {
//     printf("%s\n",getenv("mypath"));
//     return 0;
// }

//查看程序参数列表-第一个显示的是启动输入随后跟随参数
// int main(int argc,char *argv[])
// {
//     for(int i = 0;argv[i];++i)
//     {
//         printf("%s\n",argv[i]);
//     }
//     return 0;
// }

//使用参数列表完成多选项程序
// int main(int argc,char *argv[])
// {
//     //没有选项则提示可选项
//     if(argc <= 1)
//     {
//         printf("%s:可使用选项-[a/b/c]\n",argv[0]);
//         return 0;
//     }

//     //有选项则判断选项
//     if(strcmp(argv[1],"-a") == 0)
//     {
//         printf("选项a\n");
//     }
//     else if(strcmp(argv[1],"-b") == 0)
//     {
//         printf("选项b\n");
//     }
//     else if(strcmp(argv[1],"-c") == 0)
//     {
//         printf("选项c\n");
//     }
//     return 0;
// }

//修改进程优先级辅助程序！
// int main()
// {
//     while(1)
//     {
//         printf("进程运行中！pid:%d\n",getpid());
//         sleep(1);
//     }
//     return 0;
// }






//今日研究内容
// while : ;do ps axj | head -1 && ps ajx | grep 进程名 | grep -v grep; sleep 1; done 可以实现实时查询该程序的进程状态

// 循环printf检验S+休眠状态

// 然后循环去掉printf检验R运行状态

// 写一个循环printf，然后kill -19 pid 暂停程序，kill -18 启动程序，发现程序在后台运行，然后kill -9 停止程序

// 使用gdb调试程序，验证进程t被追踪状态

// echo $?  查看程序退出码

// 使用fork创建子进程然后kill掉子进程查看僵尸状态

// 使用fork创建子进程然后kill掉子进程查看孤儿进程killall + 进程名称杀掉孤儿进程

// 实验：export PATH = exe路径导入环境变量不加./运行(/home/..)
// export PATH = $PATH：+路径  正确添加
// 将程序放入/usr/bin/目录中验证环境变量

// main(int argc,char* argv,char* envp[])
// 进行实验

// 实验environ二级指针验证envp

// 实验getenv模拟实现指令

// 定义本地变量，(变量名=变量)然后 echo &变量名 查看

// 在shell创建本地变量，然后在环境变量表中验证没有被写入
// export 本地变量名，然后查找是否加入了环境变量中

// 使用参数列表argv写出可以使用选项的程序

// 写一个死循环修改进程优先级(ps -al查看正在运行的进程更加详细的信息)
// tou r  pid 输入NI值(越界设置试试)
//越界会以最大值设置，正最大值是19，负最大值是-20